
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.clima.view.mbean;

import com.brain.clima.dto.EncuestaDto;
import com.brain.clima.dto.EncuestadoDto;
import com.brain.clima.dto.OpcionDto;
import com.brain.clima.dto.PreguntaDto;
import com.brain.clima.manager.EncuestaManager;
import com.brain.clima.view.util.Comparador;
import com.brain.clima.view.util.ConstantesClima;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ApplicationHelper;
import com.brain.core.view.util.ConstantesCore;
import com.brain.sele.dto.PostulanteDto;
import com.brain.sele.view.util.ConstantesSele;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.view.util.ConstantesSgc;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
/**
 *
 * @author Cmontes
 */
@Controller("encuestaMBean")
@Scope("session")
public class EncuestaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(EncuestaMBean.class);
    @Resource
    private EncuestaManager manager;
    @Resource
    private RecursosManager recursosManager;
    private List<EncuestaDto> lista;
    private EncuestaDto dto;
    private EncuestaDto dtoFiltro;
    private String keyTitulo = "encuesta.panel";
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    
    private List<ParametroDto> listaEstados;
    private List<ParametroDto> listaEstadosFiltro;
    private List<ParametroDto> listaEstadosPregunta;
    private List<ParametroDto> listaTiposPregunta;
    
    private List<ParametroDto> listaDefOpcionesResp;
    
    private List<PreguntaDto> listaPregunta;
    private PreguntaDto preguntaDto;
    private OpcionDto opcionDto;
    private List<EncuestadoDto> listaEncuestado;
    private EncuestadoDto encuestadoDto;
    
    private Integer contIndex;
    private Integer contIndexOpciones;
    //private Boolean defaultOpciones=false;
    
    private int accionPregunta;
    private PersonaDto[] selectedPostulantes;

    public EncuestaMBean() {
        this.dtoFiltro = new EncuestaDto();
    }

    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new EncuestaDto();
        //this.dtoFiltro.setEstado(Boolean.TRUE);
        return ConstantesClima.UrlNavegacion.URL_LISTA_ENCUESTA;
    }

    public String nuevo() {
        sessionMBean.setAccion(ConstantesClima.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.lista = new ArrayList<EncuestaDto>();
        this.dto = new EncuestaDto();
        this.preguntaDto = new PreguntaDto();
        this.opcionDto = new OpcionDto();
        this.dto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_BORRADOR));
        return ConstantesClima.UrlNavegacion.URL_ENCUESTA;
    }

    public String editar() throws DAOException{
        sessionMBean.setAccion(ConstantesClima.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.preguntaDto = new PreguntaDto();
        this.opcionDto = new OpcionDto();
        
        //this.dto.setListaPreguntas(
        Collections.sort(this.dto.getListaPreguntas(), new Comparador("orden"));
                        
        
        return ConstantesClima.UrlNavegacion.URL_ENCUESTA;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesClima.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));        
        this.preguntaDto = new PreguntaDto();
        this.opcionDto = new OpcionDto();
        Collections.sort(this.dto.getListaPreguntas(), new Comparador("orden"));
        return ConstantesClima.UrlNavegacion.URL_ENCUESTA;
    }
    
    public String copiarEncuesta() throws DAOException{
        
        sessionMBean.setAccion(ConstantesClima.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        
        this.preguntaDto = new PreguntaDto();
        this.opcionDto = new OpcionDto();
        
        this.dto = this.manager.obtenerPorId(this.dto.getId());
        
        this.dto.setId(null);
        this.dto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_BORRADOR));
        
        if(this.dto.getListaPreguntas() != null){
            for(int i=0; i<this.dto.getListaPreguntas().size(); i++){
                this.dto.getListaPreguntas().get(i).setId(null);
                this.dto.getListaPreguntas().get(i).setEncuestaDto(this.dto);
                
                if(this.dto.getListaPreguntas().get(i).getListaOpcionesResp() != null){
                    for(int j=0; j<this.dto.getListaPreguntas().get(i).getListaOpcionesResp().size(); j++){
                        this.dto.getListaPreguntas().get(i).getListaOpcionesResp().get(j).setId(null);                        
                    }
                }
            }
        }
        if(this.dto.getListaEncuestados() != null){
            for(int i=0; i<this.dto.getListaEncuestados().size(); i++){
                this.dto.getListaEncuestados().get(i).setId(null);
                this.dto.getListaEncuestados().get(i).setEncuestaDto(this.dto);
                this.dto.getListaEncuestados().get(i).setPreguntaDto(null);
                this.dto.getListaEncuestados().get(i).setNumeroPregunta(null);
                this.dto.getListaEncuestados().get(i).setEstadoDto(null);
            }
        }
        
        return ConstantesClima.UrlNavegacion.URL_ENCUESTA;
    }

    public void buscar(ActionEvent ae) {        
        try {
            this.lista = this.manager.obtenerEncuestas(dtoFiltro);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public String guardar() {
        this.dto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_BORRADOR));
        if (this.manager.guardar(this.dto) != null) {
            return retroceder();
        }
        return "";
    }
    
    public String publicar() {
        if(this.dto.getListaEncuestados() == null || this.dto.getListaEncuestados().isEmpty()){
            showError(UtilCore.Internacionalizacion.getMensajeInternacional("encuestado.mensaje.noasignado"));
            return "";
        }
        if(this.dto.getListaPreguntas() == null || this.dto.getListaPreguntas().isEmpty()){
            showError(UtilCore.Internacionalizacion.getMensajeInternacional("pregunta.mensaje.noexiste"));
            return "";
        }
        
        this.dto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_GENERADO));
        if (this.manager.guardar(this.dto) != null) {
            return retroceder();
        }
        return "";
    }
    
    public String finalizar() {
        this.dto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_TERMINADO));
        if (this.manager.guardar(this.dto) != null) {
            return retroceder();
        }
        return "";
    }

    public String retroceder() {
        buscar(null);
        sessionMBean.setAccion(ConstantesSgc.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return ConstantesClima.UrlNavegacion.URL_LISTA_ENCUESTA;
    }
    
    public void agregarPregunta(){
        
        setAccionPregunta(ConstantesClima.Formulario.NUEVO);
        preguntaDto = new PreguntaDto();
        preguntaDto.setTipoPreguntaDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_ABIERTA));
        preguntaDto.setSubCategoriaDto(new ParametroDto());
        preguntaDto.setCategoriaDto(new ParametroDto());
        preguntaDto.setDefaultOpciones(false);
        
    }
    
    public void verPregunta(){
        
        preguntaDto.setDefaultOpciones(false);
        setAccionPregunta(ConstantesClima.Formulario.VER);
    }
    
    public void editarPregunta(){
        preguntaDto.setDefaultOpciones(false);
        setAccionPregunta(ConstantesClima.Formulario.EDITAR);
    }
    
    public void eliminarPregunta(){        
        if(this.dto.getListaPreguntas() !=null){
            PreguntaDto pregDto = this.dto.getListaPreguntas().get(contIndex.intValue());
            this.dto.getListaPreguntas().remove(contIndex.intValue());
            for(int i=0; i<this.dto.getListaPreguntas().size(); i++){
                if(this.dto.getListaPreguntas().get(i).getOrden()>pregDto.getOrden()){
                    this.dto.getListaPreguntas().get(i).setOrden(this.dto.getListaPreguntas().get(i).getOrden() - 1);
                }
            }
        }
    }
    
    public void agregarNuevaPregunta(){
        if(dto.getListaPreguntas() == null){
            dto.setListaPreguntas(new ArrayList<PreguntaDto>());
        }
        if(this.getAccionPregunta() == ConstantesClima.Formulario.NUEVO){
            preguntaDto.setEncuestaDto(dto);
            preguntaDto.setOrden(dto.getListaPreguntas().size() + 1);
            dto.getListaPreguntas().add(preguntaDto);            
        }
        RequestContext.getCurrentInstance().addCallbackParam("ok", true);
    }
    
    public void agregarOpcionRespuesta(){
        this.opcionDto = new OpcionDto();        
    }
    
    public void agregarNuevaOpcionRespuesta(){        
        if(preguntaDto.getListaOpcionesResp() == null){
            preguntaDto.setListaOpcionesResp(new ArrayList<OpcionDto>());
        }
        opcionDto.setPreguntaDto(preguntaDto);
        opcionDto.setOrden(preguntaDto.getListaOpcionesResp().size() + 1);
        preguntaDto.getListaOpcionesResp().add(opcionDto);
        
        this.opcionDto = new OpcionDto();
    }
    
    public void eliminarOpcionRpta(){
        if(this.preguntaDto.getListaOpcionesResp() !=null){
            OpcionDto opcDto = this.preguntaDto.getListaOpcionesResp().get(contIndexOpciones.intValue());
            this.preguntaDto.getListaOpcionesResp().remove(contIndexOpciones.intValue());
                        
            for(int i=0; i<this.preguntaDto.getListaOpcionesResp().size(); i++){
                if(this.preguntaDto.getListaOpcionesResp().get(i).getOrden()>opcDto.getOrden()){
                    this.preguntaDto.getListaOpcionesResp().get(i).setOrden(this.preguntaDto.getListaOpcionesResp().get(i).getOrden() - 1);
                }
            }            
        }
    }
    
    public void agregarEncuestado(){
        this.listaEncuestado = new ArrayList<EncuestadoDto>();
        this.encuestadoDto = new EncuestadoDto();
        this.encuestadoDto.setPersonaDto(new PersonaDto());
    }
    
    public void handleSelectPersona(SelectEvent event) {
        this.encuestadoDto = new EncuestadoDto();
        this.encuestadoDto.setPersonaDto(((PersonaDto)event.getObject()));        
    }
    
    public void handleSelectCategoria(SelectEvent event) {
        this.preguntaDto.setSubCategoriaDto(((ParametroDto)event.getObject()));
        this.preguntaDto.setCategoriaDto(this.preguntaDto.getSubCategoriaDto().getParametroPadreDto());
    }
    
    public void cambiarTipoPregunta() {
        
        if(ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_ABIERTA.equals(preguntaDto.getTipoPreguntaDto().getId())){
            preguntaDto.setListaOpcionesResp(new ArrayList<OpcionDto>());
        }
    }
    
    public void checkDefaultOpciones() {
        preguntaDto.setListaOpcionesResp(new ArrayList<OpcionDto>());
        if(!this.preguntaDto.getDefaultOpciones()){
            listaDefOpcionesResp = this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesClima.CatalogoParametro.DEFAULT_OPCIONES_RESPUESTA);
            if(listaDefOpcionesResp != null){
                for(int i=0;i<listaDefOpcionesResp.size();i++){
                    OpcionDto opcDto = new OpcionDto();
                    opcDto.setDescripcion(listaDefOpcionesResp.get(i).getDescripcion());
                    if(listaDefOpcionesResp.get(i).getValorEntero()!=null)
                        opcDto.setPeso(listaDefOpcionesResp.get(i).getValorEntero().intValue());
                    else
                        opcDto.setPeso(0);
                    opcDto.setOrden(i+1);
                    opcDto.setPreguntaDto(preguntaDto);
                    preguntaDto.getListaOpcionesResp().add(opcDto);
                }
            }            
        }
    }
    
    public void agregarNuevaPersona(){
        if(this.dto.getListaEncuestados() == null){
            this.dto.setListaEncuestados(new ArrayList<EncuestadoDto>());
        }
        
        for(int i=0; i<this.dto.getListaEncuestados().size(); i++){
            if(this.encuestadoDto.getPersonaDto().getId().equals(this.dto.getListaEncuestados().get(i).getPersonaDto().getId())){
                showError(UtilCore.Internacionalizacion.getMensajeInternacional("encuestado.mensaje.registrado"));
                
                return;
            }
        }
        this.encuestadoDto.setEncuestaDto(this.dto);
        this.dto.getListaEncuestados().add(this.encuestadoDto);
    }
    
    public void agregarEncuestadoSeleccionado(){
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        //this.accesoBtnVerPost = false;
        try {
            //List<PostulanteDto> listPost = new ArrayList<PostulanteDto>();
            //PostulanteDto dtoPost = null;
            for (PersonaDto person : this.selectedPostulantes) {
                //System.out.println("id persona: " +person.getId());
                boolean resultagrega = true;
                //Verificamos si el postulante esta asignado a la encuesta
                if(this.dto.getListaEncuestados() != null && !this.dto.getListaEncuestados().isEmpty()){
                    for(int i=0; i<this.dto.getListaEncuestados().size(); i++){
                        if(this.dto.getListaEncuestados().get(i).getPersonaDto().getId().equals(person.getId())){
                            resultado = false;
                            resultagrega = false;
                        }
                    }
                }
                if(resultagrega){
                    this.encuestadoDto = new EncuestadoDto();
                    encuestadoDto.setUsuarioCreacion(sessionMBean.getSessionUsuarioDto().getId());
                    encuestadoDto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                    encuestadoDto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                    encuestadoDto.setPersonaDto(person);                    
                    encuestadoDto.setEncuestaDto(this.dto);
                    encuestadoDto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTADO_ESTADO_PENDIENTE));

                    this.dto.getListaEncuestados().add(this.encuestadoDto);
                }
                
            }
            
            if (resultado) {
                showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok"));
            } else {
                resultado = true;
                showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("popup.encuestado.mensaje.repetidos"));
            }
        } catch (Exception ex) {
            resultado = false;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    public void eliminarEncuestado(){        
        if(this.dto.getListaEncuestados() !=null){
            this.dto.getListaEncuestados().remove(contIndex.intValue());
        }
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        EncuestaMBean.logger = logger;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public EncuestaManager getManager() {
        return manager;
    }

    public void setManager(EncuestaManager manager) {
        this.manager = manager;
    }

    public List<EncuestaDto> getLista() {
        return lista;
    }

    public void setLista(List<EncuestaDto> lista) {
        this.lista = lista;
    }

    public EncuestaDto getDto() {
        return dto;
    }

    public void setDto(EncuestaDto dto) {
        this.dto = dto;
    }

    public EncuestaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(EncuestaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public List<ParametroDto> getListaEstados() {
        //return listaEstados;
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesClima.CatalogoParametro.ESTADO_ENCUESTAS);
    }

    public void setListaEstados(List<ParametroDto> listaEstados) {
        this.listaEstados = listaEstados;
    }

    public List<ParametroDto> getListaEstadosFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoAdd(ConstantesClima.CatalogoParametro.ESTADO_ENCUESTAS,ConstantesCore.Parametro.TODOS);
    }

    public void setListaEstadosFiltro(List<ParametroDto> listaEstadosFiltro) {
        this.listaEstadosFiltro = listaEstadosFiltro;
    }

    public List<PreguntaDto> getListaPregunta() {
        return listaPregunta;
    }

    public void setListaPregunta(List<PreguntaDto> listaPregunta) {
        this.listaPregunta = listaPregunta;
    }

    public PreguntaDto getPreguntaDto() {
        return preguntaDto;
    }

    public void setPreguntaDto(PreguntaDto preguntaDto) {
        this.preguntaDto = preguntaDto;
    }

    public List<ParametroDto> getListaEstadosPregunta() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesClima.CatalogoParametro.ESTADO_PREGUNTAS);
    }

    public void setListaEstadosPregunta(List<ParametroDto> listaEstadosPregunta) {
        this.listaEstadosPregunta = listaEstadosPregunta;
    }

    public List<ParametroDto> getListaTiposPregunta() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesClima.CatalogoParametro.TIPO_PREGUNTAS);
    }

    public void setListaTiposPregunta(List<ParametroDto> listaTiposPregunta) {
        this.listaTiposPregunta = listaTiposPregunta;
    }

    public OpcionDto getOpcionDto() {
        return opcionDto;
    }

    public void setOpcionDto(OpcionDto opcionDto) {
        this.opcionDto = opcionDto;
    }

    public Integer getContIndex() {
        return contIndex;
    }

    public void setContIndex(Integer contIndex) {
        this.contIndex = contIndex;
    }

    public int getAccionPregunta() {
        return accionPregunta;
    }

    public void setAccionPregunta(int accionPregunta) {
        this.accionPregunta = accionPregunta;
    }

    public Integer getContIndexOpciones() {
        return contIndexOpciones;
    }

    public void setContIndexOpciones(Integer contIndexOpciones) {
        this.contIndexOpciones = contIndexOpciones;
    }

    public List<EncuestadoDto> getListaEncuestado() {
        return listaEncuestado;
    }

    public void setListaEncuestado(List<EncuestadoDto> listaEncuestado) {
        this.listaEncuestado = listaEncuestado;
    }

    public EncuestadoDto getEncuestadoDto() {
        return encuestadoDto;
    }

    public void setEncuestadoDto(EncuestadoDto encuestadoDto) {
        this.encuestadoDto = encuestadoDto;
    }

    public List<ParametroDto> getListaDefOpcionesResp() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesClima.CatalogoParametro.DEFAULT_OPCIONES_RESPUESTA);
    }

    public void setListaDefOpcionesResp(List<ParametroDto> listaDefOpcionesResp) {
        this.listaDefOpcionesResp = listaDefOpcionesResp;
    }

    public PersonaDto[] getSelectedPostulantes() {
        return selectedPostulantes;
    }

    public void setSelectedPostulantes(PersonaDto[] selectedPostulantes) {
        this.selectedPostulantes = selectedPostulantes;
    }
    
    
}
